package routers

import (
	"fmt"
	"strings"

	"gitee.com/small_fish_official_net/beego_frame/bash"
	"gitee.com/small_fish_official_net/beego_frame/controllers"
	"github.com/astaxie/beego"
)

// 路由初始化函数，用来将url地址等注册进程序中
func init() {
	for i, v := range getRouterRoot() {
		beego.Router(str_i(i), &controllers.Root{}, str_v(v))
	}
	for i, v := range getRouterAdmin() {
		if len(i) > 2 && i[0:2] == "a:" {
			beego.Router("/admin"+str_i_no_method(i), &controllers.Admin{}, "get:"+str_v_no_method(v))
			beego.Router("/admin"+str_i_no_method(i), &controllers.Admin{}, "post:"+str_v_no_method(v))
		} else {
			beego.Router("/admin"+str_i(i), &controllers.Admin{}, str_v(v))
		}
	}
	for i, v := range getRouterApi() {
		if len(i) > 2 && i[0:2] == "a:" {
			beego.Router("/api"+str_i_no_method(i), &controllers.Api{}, "get:"+str_v_no_method(v))
			beego.Router("/api"+str_i_no_method(i), &controllers.Api{}, "post:"+str_v_no_method(v))
		} else {
			beego.Router("/api"+str_i(i), &controllers.Api{}, str_v(v))
		}
	}
	// 将40x、50x统一处理
	for i := 0; i <= 51; i++ {
		beego.ErrorHandler(fmt.Sprintf("4%02d", i), controllers.PageNotFound)
	}
	for i := 0; i <= 11; i++ {
		beego.ErrorHandler(fmt.Sprintf("5%02d", i), controllers.ServerError)
	}
}

// 格式化路由的URL参数地址信息
//
// 如果检测到未添加/前缀则会自动添加/前缀
func str_i(str string) string {
	// 如果是空字符串则直接返回/地址
	if len(str) == 0 {
		return "/"
	}
	if len(str) > 2 && str[1:2] == ":" {
		str = str[2 : len(str)-2]
	}
	if str[0:1] != "/" {
		return "/" + str
	}
	return str
}

// 格式化路由规则的值信息
//
// 采用分割的形式，使用:分割字符串，若分割结果只有一个则直接拼接get:
//
// 会将路由的对象首字母自动转大写
func str_v(str string) string {
	kv := strings.Split(str, ":")
	if len(kv) == 1 {
		if kv[0][0:2] == "p/" {
			return "post:" + bash.StringToFirstUpper(kv[0][2:len(kv[0])])
		}
		// 如果只有一个的话
		return "get:" + bash.StringToFirstUpper(kv[0])
	}
	return kv[0] + ":" + bash.StringToFirstUpper(kv[1])
}

// 格式化路由的URL参数地址信息
//
// 如果检测到未添加/前缀则会自动添加/前缀
func str_i_no_method(str string) string {
	// 如果是空字符串则直接返回/地址
	if len(str) == 0 {
		return "/"
	}
	if len(str) > 2 && str[1:2] == ":" {
		str = str[2:len(str)]
	}
	if str[0:1] != "/" {
		return "/" + str
	}
	return str
}
func str_v_no_method(str string) string {
	kv := strings.Split(str, ":")
	if len(kv) == 1 {
		return bash.StringToFirstUpper(kv[0])
	}
	return bash.StringToFirstUpper(kv[1])
}
